/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package cara.tp1.client;

import cara.tp1.server.*;
import cara.tp1.server.domain.Livre;
import cara.tp1.server.domain.Personne;
import org.apache.cxf.frontend.ClientProxyFactoryBean;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.List;

public final class Client {

    private Client() {
    }

    public static void main(String args[]) throws Exception {
        ClientProxyFactoryBean biblioFactory = new ClientProxyFactoryBean();
        ClientProxyFactoryBean usagerFactory = new ClientProxyFactoryBean();
        //   ClientProxyFactoryBean factory = new ClientProxyFactoryBean();
        biblioFactory.setAddress("http://localhost:9000/Bibliothecaire");
        usagerFactory.setAddress("http://localhost:9000/Usager");


        Bibliothecaire bibliothecaire = biblioFactory.create(Bibliothecaire.class);
        Usager usager = usagerFactory.create(Usager.class);


        String in ="";
        //Scanner sc = new Scanner(System.in);
        BufferedReader sc = new BufferedReader(new InputStreamReader(System.in));

        int choix;
        int choixBiblio;
        int choixUsager;
        do {


            System.out.println("Quel est votre rôle ?");
            System.out.println("1- Un bibliothécaire");
            System.out.println("2- Un usager");
            System.out.println("0- Quitter");

            choix = Integer.valueOf(sc.readLine());

            //menu bibliothecaire
            if(choix == 1 ){


                do {
                    System.out.println();
                    System.out.println("Que voulez vous faire ?");
                    System.out.println("1- Consulter la liste des usagers");
                    System.out.println("2- Ajouter un usager");
                    System.out.println("3- Supprimer un usager");
                    System.out.println("4- Ajouter un livre");
                    System.out.println("5- Supprimer un livre");
                    System.out.println("6- Consulter livre par son Titre");
                    System.out.println("7- Consulter livre par son Auteur");
                    System.out.println("8- Consulter livre par son Auteur et Titre");

                    System.out.println("0- quitter");

                    choixBiblio = Integer.valueOf(sc.readLine());


                    if(choixBiblio == 1){
                        System.out.println("Voici les usagers inscrits :");
                        for (Personne personne : bibliothecaire.consulterPersonnes()) {
                            System.out.println(personne.getNom() + " " + personne.getPrenom());
                        }

                    }

                    if(choixBiblio==2){
                        System.out.println("nom");
                        String nom = sc.readLine();
                        System.out.println("prenom");
                        String prenom =sc.readLine();
                        Personne personne = new Personne();
                        personne.setPrenom(prenom);
                        personne.setNom(nom);
                        bibliothecaire.ajouterPersonne(personne);
                        System.out.println("L'usager "+ nom + " " + prenom + " a était ajouté");

                    }

                    if(choixBiblio == 3){

                        System.out.println("nom");
                        String nom = sc.readLine();
                        System.out.println("prenom");
                        String prenom =sc.readLine();
                        Personne personne = new Personne();
                        personne.setPrenom(prenom);
                        personne.setNom(nom);
                        bibliothecaire.supprimerPersonne(personne);
                        System.out.println("L'usager "+ nom + " " + prenom + " a était supprimé");
                    }

                    //ajouter livre
                    if(choixBiblio == 4){

                        System.out.println("titre");
                        String titre = sc.readLine();
                        System.out.println("editeur");
                        String editeur =sc.readLine();
                        System.out.println("auteur");
                        String auteur =sc.readLine();
                        System.out.println("ISBN");
                        String ISBN =sc.readLine();


                        Livre livre = new Livre();
                        livre.setTitre(titre);
                        livre.setEditeur(editeur);
                        livre.setAuteur(auteur);
                        livre.setISBN(ISBN);

                        bibliothecaire.ajouterLivre(livre);
                        System.out.println("Le livre a était ajouté");
                    }

                    //supprimer Livre
                    if(choixBiblio == 5){

                        System.out.println("Donnez le numero ISBN du livre à supprimer");
                        String ISBN =sc.readLine();

                        Livre livre = new Livre();
                        livre.setISBN(ISBN);
                        bibliothecaire.supprimerLivre(livre);
                        System.out.println("Le livre ayant l'ISBN " +ISBN +" a était supprimé");


                    }

                    //6- Consulter livre par son Titre");
                    if(choixBiblio == 6){

                        System.out.println("Titre du livre");
                        String titre =sc.readLine();

                        List<Livre> livres = bibliothecaire.consulterLivreParTitre(titre);

                        if(null == livres) {
                            System.out.println("Aucun livre correspondant à votre critere");

                        }else{

                            System.out.println("Voici la liste de livre(s) correspondant à votre critere");
                            for (Livre livre : livres) {

                                System.out.println("Titre: " +livre.getTitre());
                                System.out.println("Auteur: " +livre.getAuteur());
                                System.out.println("Editeur: " +livre.getEditeur());
                                System.out.println("ISBN: " +livre.getISBN() + "\n");

                            }
                        }

                    }

                    // Consulter livre par son Auteur
                    if(choixBiblio == 7){

                        System.out.println("Auteur du livre");
                        String auteur =sc.readLine();

                        List<Livre> livres = bibliothecaire.consulterLivreParAuteur(auteur);


                        if(null == livres) {
                            System.out.println("Aucun livre correspondant à votre critere");

                        }else{

                            System.out.println("Voici la liste de livre(s) correspondant à votre critere");

                            for (Livre livre : livres) {

                                System.out.println("Titre " +livre.getTitre());
                                System.out.println("Auteur " +livre.getAuteur());
                                System.out.println("Editeur " +livre.getEditeur());
                                System.out.println("ISBN " +livre.getISBN() + "\n");

                            }
                        }
                    }

                    //Consulter livre par son Auteur et Titre"
                    if(choixBiblio == 8){

                        System.out.println("Titre du livre");
                        String titre =sc.readLine();
                        System.out.println("Auteur du livre");
                        String auteur =sc.readLine();

                        List<Livre> livres = bibliothecaire.consulterLivreParAuteurEtTitre(auteur, titre);

                        if(null == livres) {
                            System.out.println("Aucun livre correspondant à votre critere");

                        }else{

                            System.out.println("Voici la liste de livre(s) correspondant à votre critere");
                            for (Livre livre : livres) {

                                System.out.println("Titre " +livre.getTitre());
                                System.out.println("Auteur " +livre.getAuteur());
                                System.out.println("Editeur " +livre.getEditeur());
                                System.out.println("ISBN " +livre.getISBN() + "\n");

                            }
                        }
                    }

                }while (choixBiblio  != 0);


            }

            //menu usager
            if(choix == 2){
                String nom;
                String prenom;
                Personne personne = new Personne();
                System.out.println("Veuillez donner votre nom");
                nom =sc.readLine();
                System.out.println("Veuillez donner votre prenom");
                prenom =sc.readLine();
                personne.setNom(nom);
                personne.setPrenom(prenom);

                do {
                    System.out.println();
                    System.out.println("Que voulez vous faire ?");
                    System.out.println("1- Emprunter un livre");
                    System.out.println("2- Restituer un livre");
                    System.out.println("3- Reserver un libre");
                    System.out.println("4- Consulter tous les livres");
                    System.out.println("5- Consulter livre par titre");
                    System.out.println("6- Consulter livre par auteur");
                    System.out.println("7- Consulter livre par ISBN");

                    System.out.println("0- quitter");

                    choixUsager = Integer.valueOf(sc.readLine());

                    //emprunter un livre
                    if(choixUsager==1){
                        System.out.println("Quel est le numero ISBN du livre ?");
                        String isbn =sc.readLine();
                        try {
                            usager.emprunterLivre(isbn,personne);
                        }catch (LivreInconnuExeption livreInconnuExeption)
                        {
                            System.out.println(livreInconnuExeption.getMessage());
                        }
                        catch (EmprunterExeption emprunterExeption)
                        {
                            System.out.println(emprunterExeption.getMessage());
                        }

                    }

                    //restituer un livre
                    if(choixUsager==2){
                        System.out.println("Quel est le numero ISBN du livre ?");
                        String isbn =sc.readLine();
                        usager.restituerLivre(isbn,personne);
                    }

                    if(choixUsager==3){
                        System.out.println("Quel est le numero ISBN du livre à reserver ?");
                        String isbn =sc.readLine();
                        try {
                            usager.reserverLivre(isbn,personne);
                        }catch (LivreNonEmprunteExeption livreNonEmprunteExeption){
                            System.out.println(livreNonEmprunteExeption.getMessage());
                        }
                        catch (LivreDejaReserverExeption livreDejaReserverExeption){
                            System.out.println(livreDejaReserverExeption.getMessage());
                        }
                        catch (LivreInconnuExeption livreInconnuExeption){
                            System.out.println(livreInconnuExeption.getMessage());
                        }
                    }

                    //Consulter tous les livres
                    if(choixUsager==4){
                        List<Livre> livres = usager.consulterTousLesLivres();

                        if(null == livres) {
                            System.out.println("Aucun livre correspondant à votre critere");

                        }else{

                            System.out.println("Voici la liste de tous les livres:");
                            for (Livre livre : livres) {

                                System.out.println("Titre: " +livre.getTitre());
                                System.out.println("Auteur: " +livre.getAuteur());
                                System.out.println("Editeur: " +livre.getEditeur());
                                System.out.println("ISBN: " +livre.getISBN() + "\n");

                            }
                        }
                    }

                    //Consulter livres par titre
                    if(choixUsager==5){

                        System.out.println("Titre du livre");
                        String titre =sc.readLine();

                        List<Livre> livres = bibliothecaire.consulterLivreParTitre(titre);

                        if(null == livres) {
                            System.out.println("Aucun livre correspondant à votre critere");

                        }else{

                            System.out.println("Voici la liste de livre(s) correspondant à votre critere");
                            for (Livre livre : livres) {

                                System.out.println("Titre: " +livre.getTitre());
                                System.out.println("Auteur: " +livre.getAuteur());
                                System.out.println("Editeur: " +livre.getEditeur());
                                System.out.println("ISBN: " +livre.getISBN() + "\n");

                            }
                        }
                    }

                    //Consulter livres par titre
                    if(choixUsager==6){

                        System.out.println("Auteur du livre");
                        String titre =sc.readLine();

                        List<Livre> livres = bibliothecaire.consulterLivreParAuteur(titre);

                        if(null == livres) {
                            System.out.println("Aucun livre correspondant à votre critere");

                        }else{

                            System.out.println("Voici la liste de livre(s) correspondant à votre critere");
                            for (Livre livre : livres) {

                                System.out.println("Titre: " +livre.getTitre());
                                System.out.println("Auteur: " +livre.getAuteur());
                                System.out.println("Editeur: " +livre.getEditeur());
                                System.out.println("ISBN: " +livre.getISBN() + "\n");

                            }
                        }
                    }


                    //Consulter livres par ISBN
                    if(choixUsager==7){
                        System.out.println("Quel est le numero ISBN du livre ?");
                        String isbn =sc.readLine();
                        Livre livre = usager.consulterLivreParISBN(isbn);

                        if(livre!=null){

                            System.out.println("Voici les données associées au livre: ");

                            System.out.println("Titre: " +livre.getTitre());
                            System.out.println("Auteur: " +livre.getAuteur());
                            System.out.println("Editeur: " +livre.getEditeur());
                            System.out.println("ISBN: " +livre.getISBN() + "\n");

                        }else{
                            System.out.println("Aucun livre correspondant au numero d'ISBN : " +isbn);
                        }

                    }



                }
                while (choixUsager  != 0);

            }
        }
        while (choix  != 0);

        System.exit(0);
    }

}

